home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / diskmags / 3565-4.665 / dmg-4182 / a / 33.pne < prev    next >
Text File  |  1987-04-21  |  6KB  |  227 lines

  1.  
  2.      Speeding Up Your STOS Programs
  3.              By Billy Allan
  4.  
  5.  
  6.  Let's face it, STOS isn't the fastest
  7. of languages. Unfortunately, this is
  8. usually compounded by people not bother-
  9. ing to optimise their programs.
  10.  I have seen a great deal of STOS
  11. programs recently which go at an
  12. astoundingly slow rate. Most of them
  13. could be speeded up greatly if the
  14. authors took a little time to try out
  15. various ways of doing things, or even
  16. paused to think about a routine before
  17. they wrote it.
  18.  For example, take the following BASIC
  19. list.
  20.  
  21. 10 for T=0 to 9
  22. 20 bob logic,start(1),0,X(T),Y(T),0
  23. 22 for Q=0 to 9
  24. 23 if Q=T then goto 25
  25. 24 if overlap(X(Q),Y(Q),X(T),Y(T),16,16,
  26.   16,16) then swap SX(Q),SX(T) : swap SY
  27.   (Q),SY(T)
  28. 25 next Q
  29. 30 X(T)=X(T)+SX(T)
  30. 40 if X(T)<0 then X(T)=320
  31. 50 if X(T)>320 then X(T)=0
  32. 60 Y(T)=Y(T)+SY(T)
  33. 70 if Y(T)<0 then Y(T)=200
  34. 80 if Y(T)>200 then Y(T)=0
  35. 90 next T
  36. 100 goto 10
  37.  
  38.  Ok, a fairly contrived loop. But let's
  39. go through it stage by stage and see
  40. what we can find to optimise.
  41.  First of all we get replace the "start
  42. (1)" with a variable.
  43.  
  44. 5 S1=start(1)
  45. 10 for T=0 to 9
  46. 20 bob logic,S1,0,X(T),Y(T),0
  47. 22 for Q=0 to 9
  48. 23 if Q=T then goto 25
  49. 24 if overlap(X(Q),Y(Q),X(T),Y(T),16,16,
  50.   16,16) then swap SX(Q),SX(T) : swap SY
  51.   (Q),SY(T)
  52. 25 next Q
  53. 30 X(T)=X(T)+SX(T)
  54. 40 if X(T)<0 then X(T)=320
  55. 50 if X(T)>320 then X(T)=0
  56. 60 Y(T)=Y(T)+SY(T)
  57. 70 if Y(T)<0 then Y(T)=200
  58. 80 if Y(T)>200 then Y(T)=0
  59. 90 next T
  60. 100 goto 10
  61.  
  62.  Now we can also use the MANY BOB
  63. command to draw the sprites.
  64.  
  65. 5 S1=start(1)
  66. 10 many bob logic,S1,varptr(IMG(0)),
  67.   varptr(X(0)),varptr(Y(0)),varptr(BON
  68.   (0)),0,0,0
  69. 20 for T=0 to 9
  70. 22 for Q=0 to 9
  71. 23 if Q=T then goto 25
  72. 24 if overlap(X(Q),Y(Q),X(T),Y(T),16,16,
  73.   16,16) then swap SX(Q),SX(T) : swap SY
  74.   (Q),SY(T)
  75. 25 next Q
  76. 30 X(T)=X(T)+SX(T)
  77. 40 if X(T)<0 then X(T)=320
  78. 50 if X(T)>320 then X(T)=0
  79. 60 Y(T)=Y(T)+SY(T)
  80. 70 if Y(T)<0 then Y(T)=200
  81. 80 if Y(T)>200 then Y(T)=0
  82. 90 next T
  83. 100 goto 10
  84.  
  85.  Now we can replace those time-consuming
  86. VARPTR's with variables as well.
  87.  
  88. 5 S1=start(1) : VIMG=varptr(IMG(0)) : VX
  89.   =varptr(X(0)) : VY=varptr(Y(0)) : VON=
  90.   varptr(BON(0))
  91. 10 many bob logic,S1,VIMG,VX,VY,VON,0,0
  92.   ,0
  93. 20 for T=0 to 9
  94. 22 for Q=0 to 9
  95. 23 if Q=T then goto 25
  96. 24 if overlap(X(Q),Y(Q),X(T),Y(T),16,16,
  97.   16,16) then swap SX(Q),SX(T) : swap SY
  98.   (Q),SY(T)
  99. 25 next Q
  100. 30 X(T)=X(T)+SX(T)
  101. 40 if X(T)<0 then X(T)=320
  102. 50 if X(T)>320 then X(T)=0
  103. 60 Y(T)=Y(T)+SY(T)
  104. 70 if Y(T)<0 then Y(T)=200
  105. 80 if Y(T)>200 then Y(T)=0
  106. 90 next T
  107. 100 goto 10
  108.  
  109.  Which makes the MANY BOB look a damn
  110. sight better as well. Now notice that
  111. the FOR Q..NEXT loop checks the X(T) and
  112. Y(T) variables. But in the Q loop, T is
  113. never changed so we are accessing X(T)
  114. and Y(T) 10 times to get the same value
  115. each time. But as we all know, accessing
  116. a normal variable is faster than access-
  117. ing an array element, so why don't we
  118. store the current X and Y in temporary
  119. variables before entering the loop?
  120.  
  121. 5 S1=start(1) : VIMG=varptr(IMG(0)) : VX
  122.   =varptr(X(0)) : VY=varptr(Y(0)) : VON=
  123.   varptr(BON(0))
  124. 10 many bob logic,S1,VIMG,VX,VY,VON,0,0
  125.   ,0
  126. 20 for T=0 to 9
  127. 21 TX=X(T) : TY=Y(T)
  128. 22 for Q=0 to 9
  129. 23 if Q=T then goto 25
  130. 24 if overlap(X(Q),Y(Q),TX,TY,16,16,16,
  131.   16) then swap SX(Q),SX(T) : swap SY(Q)
  132.   ,SY(T)
  133. 25 next Q
  134. 30 X(T)=X(T)+SX(T)
  135. 40 if X(T)<0 then X(T)=320
  136. 50 if X(T)>320 then X(T)=0
  137. 60 Y(T)=Y(T)+SY(T)
  138. 70 if Y(T)<0 then Y(T)=200
  139. 80 if Y(T)>200 then Y(T)=0
  140. 90 next T
  141. 100 goto 10
  142.  
  143.  Notice that we didn't change the SX/Y
  144. (T)'s. This is because in this parti-
  145. cular case we are unlikely to get many
  146. collisions actually happening. In diff-
  147. erent programs it's always worth check-
  148. ing to see whether a given variable is
  149. worth storing. Now that we have the X
  150. and Y as variables we would be as well
  151. changing all the other occuences in the
  152. loop.
  153.  
  154. 5 S1=start(1) : VIMG=varptr(IMG(0)) : VX
  155.   =varptr(X(0)) : VY=varptr(Y(0)) : VON=
  156.   varptr(BON(0))
  157. 10 many bob logic,S1,VIMG,VX,VY,VON,0,0
  158.   ,0
  159. 20 for T=0 to 9
  160. 21 TX=X(T) : TY=Y(T)
  161. 22 for Q=0 to 9
  162. 23 if Q=T then goto 25
  163. 24 if overlap(X(Q),Y(Q),TX,TY,16,16,16,
  164.   16) then swap SX(Q),SX(T) : swap SY(Q)
  165.   ,SY(T)
  166. 25 next Q
  167. 30 TX=TX+SX(T)
  168. 40 if TX<0 then TX=320
  169. 50 if TX>320 then TX=0
  170. 60 TY=TY+SY(T)
  171. 70 if TY<0 then TY=200
  172. 80 if TY>200 then TY=0
  173. 85 X(T)=TX : Y(T)=TY90
  174. 90 next T
  175. 100 goto 10
  176.  
  177.  Notice that we have to store the new X
  178. and Y back in the array at the end of
  179. the loop in line 85. Now, in this case
  180. we can make use of the MANY ADD command.
  181. This is only applicable in some
  182. instances, but this happens to be one of
  183. them.
  184.  
  185. 5 S1=start(1) : VIMG=varptr(IMG(0)) : VX
  186.   =varptr(X(0)) : VY=varptr(Y(0)) : VON=
  187.   varptr(BON(0))
  188. 6 VSX=varptr(SX(0)) : VSY=varptr(SY(0))
  189. 10 many bob logic,S1,VIMG,VX,VY,VON,0,0
  190.   ,0
  191. 15 many add VX,VSX,9,0,320
  192. 16 many add VY,VSY,9,0,200
  193. 20 for T=0 to 9
  194. 21 TX=X(T) : TY=Y(T)
  195. 22 for Q=0 to 9
  196. 23 if Q=T then goto 25
  197. 24 if overlap(X(Q),Y(Q),TX,TY,16,16,16,
  198.   16) then swap SX(Q),SX(T) : swap SY(Q)
  199.   ,SY(T)
  200. 25 next Q
  201. 90 next T
  202. 100 goto 10
  203.  
  204.  So now we have a loop which does exact-
  205. ly the same thing, but about 5 times
  206. faster.
  207.  Doing this to your whole game can prod-
  208. uce quite significant results. One has
  209. to bare in mind that arcade games should
  210. not update at more than 4 vbls (that's
  211. 50/4 or 12.5 frames a second), 2-3 being
  212. the normal level. If your game is updat-
  213. ing very slowly, then don't just release
  214. it and blame STOS for it being slow - it
  215. is possible to write fast games in STOS,
  216. it just takes a little effort on the
  217. part of the programmers.
  218.  So next time you see a STOS game which
  219. takes about a second to respond to a
  220. joystick press don't just think "God,
  221. STOS is awful" - think "God, this prog-
  222. rammer is awful!"
  223.  
  224.  
  225.            Billy Allan - 1993
  226.  
  227.